import 'dart:io';
import 'package:flutter/material.dart';
import 'package:path/path.dart' as p;

import '../internal/path_resolver.dart';
import '../node_tile.dart';
import 'node_dialogs.dart' as dialogs;

/// 处理「新建文件/文件夹」的交互与实际创建逻辑。
///
/// 流程：
/// 1) 校验当前选中节点必须是文件夹；
/// 2) 使用 [PathResolver] 解析父级真实路径；
/// 3) 弹出命名对话框并校验名称；
/// 4) 基于真实路径创建文件或文件夹（避免同名冲突）；
/// 5) 刷新当前目录；
/// 6) 自动选中新创建的节点并提示结果。
///
/// 参数说明：
/// - [context] 当前 Build 上下文；
/// - [widget] 承载文件结点信息与回调（如 `onToggle`/`onSelect`/`onRename` 等）的 UI 容器；
/// - [isFolder] 是否创建文件夹（`false` 时创建文件）。
Future<void> handleCreate({
  required BuildContext context,
  required NodeTile widget,
  required bool isFolder,
}) async {
  final String op = isFolder ? 'create_folder' : 'create_file';
  if (!widget.node.isFolder) {
    dialogs.toast(context, 'Folders can only be created within folders');
    return;
  }

  final resolver = PathResolver(external: widget.realPathResolver);
  final String parentReal = resolver.resolve(widget.path, widget.node);

  if (parentReal.isEmpty) {
    dialogs.toast(context, 'Creation failed: Unable to resolve real path (missing mapping)');
    return;
  }

  final String? name = await dialogs.promptNewName(context, isFolder: isFolder);
  if (name == null) return;

  final String target = p.normalize(p.join(parentReal, name));
  final sw = Stopwatch()..start();

  try {
    if (isFolder) {
      final dir = Directory(target);
      if (await dir.exists()) {
        dialogs.toast(context, 'A file with the same name already exists');
        return;
      }
      await dir.create(recursive: true);
    } else {
      final file = File(target);
      if (await file.exists()) {
        dialogs.toast(context, 'A file with the same name already exists');
        return;
      }
      await file.create(recursive: true);
    }

    await refreshCurrentFolder(widget: widget, reason: op);

    final newLogicalPath = widget.path.isEmpty ? name : '${widget.path}/$name';
    Future.microtask(() => widget.onSelect(newLogicalPath, widget.node));

    dialogs.toast(context, isFolder ? 'Folder created' : 'File created');
    sw.stop();
  } catch (_) {
    sw.stop();
    dialogs.toast(context, isFolder ? 'Failed to create folder' : 'Failed to create file');
  }
}

/// 处理「重命名」交互与实际重命名逻辑。
///
/// 流程：
/// 1) 弹出重命名对话框并校验名称；
/// 2) 通过宿主回调 [NodeTile.onRename] 执行重命名（可能由服务层完成）；
/// 3) 根据结果刷新/选中并提示；
///
/// 参数说明：
/// - [context] 当前 Build 上下文；
/// - [widget] 承载文件结点信息与回调的 UI 容器。
Future<void> handleRename({
  required BuildContext context,
  required NodeTile widget,
}) async {
  final String? newName =
  await dialogs.promptRenameName(context, widget.node.name);
  if (newName == null || newName == widget.node.name) return;

  final sw = Stopwatch()..start();
  try {
    final ok = await widget.onRename(widget.path, widget.node, newName);
    sw.stop();
    if (!ok) {
      dialogs.toast(
        context,
        'Rename failed: A file with the same name already exists or the path is not resolvable',
      );
      return;
    }

    final parentLogical = widget.path.contains('/')
        ? widget.path.substring(0, widget.path.lastIndexOf('/'))
        : widget.node.name;

    final newLogicalPath =
    widget.path.contains('/') ? '$parentLogical/$newName' : newName;

    Future.microtask(() => widget.onSelect(newLogicalPath, widget.node));
    dialogs.toast(context, 'Renamed to "$newName"');
  } catch (_) {
    sw.stop();
    dialogs.toast(context, 'Rename failed');
  }
}

/// 刷新当前目录节点（折叠→展开 或 首次展开）。
///
/// 说明：
/// - 若当前节点已展开：先折叠再展开，以触发刷新；
/// - 若未展开：直接触发展开；
/// - 中间插入一帧的延迟（约 16ms）以确保 UI 有机会完成一次布局再进行下一次操作。
///
/// 参数说明：
/// - [widget] 承载节点信息与回调的 UI 容器；
/// - [reason] 可选的刷新原因字符串，便于追踪或日志记录。
Future<void> refreshCurrentFolder({
  required NodeTile widget,
  String reason = 'unknown',
}) async {
  if (widget.expanded) {
    widget.onToggle(widget.node, widget.path);
    await Future.delayed(const Duration(milliseconds: 16));
    widget.onToggle(widget.node, widget.path);
  } else {
    widget.onToggle(widget.node, widget.path);
  }
}
